<?php

namespace App\Http\Controllers;

use App\Http\Common\FilesTools;
use App\Http\Common\Globals;
use App\Http\Common\MyUtils;
use App\Models\BaseModel;
use Illuminate\Http\Request;

class BaseController extends Controller
{
    public $request;// 请求
    public $form = null;// 过滤的表单
    public $limit;// 分页的参数，一页多少数据，把 limit 过滤掉，用这个
    public $page;// 第几页 ，把 page 过滤掉，用这个
    public $offset;// 每页的偏移量
    public $model = null;// 数据库模型
    public static $frontPageName = ['pageNo','pageSize','totalCount','current'];// 前端的分页字段名字
    public function __construct()
    {
        $this->request = Request::capture();
        if (!$this->model)$this->model = new BaseModel();
        if (self::$frontPageName
                && count(self::$frontPageName)>=2
                && $t0 = $this->request->get(self::$frontPageName[0])
                && $t1 = $this->request->get(self::$frontPageName[1])){
            MyUtils::setRequest($this->request,'page',$t0);
            MyUtils::setRequest($this->request,'limit',$t1);
        }
        $this->getPages();
    }
    /**
     * 拿到分页信息
     * @param $request
     */
    public function getPages(){
        // 拿到分页的 每一页多少数据
        $this->limit = $this->request->get(self::$frontPageName[1], 20);
        $this->model->perPage = $this->limit;
        // 拿到第几页
        $this->page = $this->request->get(self::$frontPageName[0], 1);
        $this->offset = $this->limit*($this->page-1);
    }
    /**
     * 使用可变的函数
     * @param $name 可变函数的名称
     * @param array $message 成功失败结果，为数组
     * @param bool $ifCheckRequest 是否检验 表单验证
     * @param bool $ifReturnModel 是否需要返回查询到的模型
     * @return mixed|string
     */
    public function useChangeFunction($name,$message=['成功','失败'],$ifCheckRequest=true,$ifReturnModel=false){
        MyUtils::setSuccessFaildMessage($message[0],$message[1]);
        if ($ifCheckRequest){
            // 验证提交过来的数据是否在数据库里面已经存了， 是否唯一
            $res = MyUtils::validateRequest($this,$this->form);
            if ($res)return $res;
        }
        $res = $this->model->$name($this->request);
        if ($res){
            if (!$ifReturnModel){
                $res = Globals::$success;
            }
            return MyUtils::dealFD($res,1);
        }else{
            return MyUtils::dealFD(Globals::$error,-1);
        }
    }
    /**
     * 查询列表
     * @return string
     */
    public function list(){
        // 所有的数据的数量
        $count = $this->model->count();
        // 分页后的数据
        $lists = $this->model->list($this->limit,$this->page);
        // 对象转化为数组
        $data[self::$frontPageName[2]] = $count;
        $data['data'] = $lists;
        $data[self::$frontPageName[0]] = $this->page;
        return MyUtils::df($data);
    }
    /**
     * 删除 当登录或者是 传输过来的表单验证发生问题 就会定位到这里
     * @params id 传递需要删除的id
     */
    public function delete(){
        MyUtils::setSFM('删除成功！','删除失败！');
        if ($this->model->storeDelete()){
            return MyUtils::dealFD(Globals::$success,1);
        }else{
            return MyUtils::dealFD(Globals::$error,-1);
        }
    }
    // 包括了新增与修改
    public function save(){
        $id = $this->model->getKey();
        if ($id){// 修改
            return $this->update();
        }else{// 新增
            return $this->add();
        }
    }
    public function add(){
        MyUtils::setSFM('新增成功！','新增失败！');
        // 验证提交过来的数据是否在数据库里面已经存了， 是否唯一
        $res = MyUtils::validateRequest($this,$this->form);
        if ($res)return $res;
        if ($this->model->store()){
            return MyUtils::dealFD(Globals::$success,1);
        }else{
            return MyUtils::dealFD(Globals::$error,-1);
        }
    }
    public function update(){
        MyUtils::setSFM('修改成功！','修改失败！');
        // 验证提交过来的数据是否在数据库里面已经存了， 是否唯一
        $res = MyUtils::validateRequest($this,$this->form);
        if ($res)return $res;
        if ($this->model->storeUpdate()){
            return MyUtils::dealFD(Globals::$success,1);
        }else{
            return MyUtils::dealFD(Globals::$error,-1);
        }
    }
    /**
     * 查询详情
     */
    public function detail(){
        $res = $this->model->storeDetail();
        if ($res){
            return MyUtils::df($res,1);
        }else{
            return MyUtils::df(Globals::$error,-1);
        }
    }
    /**
     * 上传头像信息等接口
     */
    public function uploadFile(){
        $filesTools = FilesTools::getInstance();
        // 拿到文件对象
        $files = $this->request->files;
        // 上传文件的名称
        $name = pathinfo($files['file']['name'])['name'];
        // 上传文件的临时路径
        $path = $files['file']['tmp_name'];
        // 腾讯的上传文件方法
        $res = $filesTools->tencentFileInitAndDownload("tencentFileUpload",$name,$path);
        return MyUtils::dealFD($res,1);
    }
    /**
     * 所有的错误报错接口
     */
    public function error(){
        $errorMessage = "错误";
        if ($this->request->errorMessage){
            $errorMessage = $this->request->errorMessage;
        }
        return MyUtils::df($errorMessage,-1,['retMsg'=>'error']);
    }
}
